#include <iostream>
#include <stack>
using namespace std;
struct node
{
    int a, b, c, n; // 这里的a,b,c对应的位置就是原本柱，借助柱，目标柱
    node(int m, int x, int y, int z) : n(m), a(x), b(y), c(z) {}
};
int main()
{
    int n;
    cin >> n;
    stack<node> s;
    s.push(node(n, 'a', 'b', 'c'));
    while (!s.empty())
    {
        node t = s.top();
        s.pop();
        if (t.n == 1)
            printf("%c -> %c\n", t.a, t.c);
        else
        {
            s.push(node(t.n - 1, t.b, t.a, t.c)); // 第三步，n-1盘中借助a移到c
            s.push(node(1, t.a, t.b, t.c));       // 第二步，一个盘中借助b移到c
            s.push(node(t.n - 1, t.a, t.c, t.b)); // 第一步，将n-1盘子借助c移到b
        }
    }
    return 0;
}
/*#include<iostream>
#include<stack>
using namespace std;
struct Status
{
    int n;//盘数
    char a;//第一个柱子;
    char b;//第二个柱子;
    char c;//第三个柱子;
    Status(int n, char a, char b,char c) :n(n), a(a), b(b), c(c) {}
};
void dfs(Status sts) {
    stack<Status> stk;
    stk.push(sts);
    Status cur=sts;
    while (!stk.empty())
    {
        cur = stk.top();
        stk.pop();
        if (cur.n == 1) {
            cout << cur.a << " "<<"->"<<" " << cur.c << endl;
            continue;
        }
        stk.push(Status(cur.n -1, cur.b, cur.a, cur.c));
        stk.push(Status(1,cur.a,cur.b,cur.c));
        stk.push(Status(cur.n-1,cur.a,cur.c,cur.b));


    }
    return;
}
int main() {
    int n = 3;    //盘数
    char a = 'a';  //第一个柱子
    char b = 'b';  //第二个柱子
    char c = 'c';  //第三个柱子


    Status pro(n, a, b, c);
    dfs(pro);
}*/